```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JPA查询方式对比：JPQL与原生SQL | 技术小馆</title>
    <link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css">
    <link rel="stylesheet" href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            color: #333;
            line-height: 1.6;
        }
        .hero-title {
            font-family: 'Noto Serif SC', serif;
            text-shadow: 1px 1px 4px rgba(0,0,0,0.2);
        }
        .drop-cap::first-letter {
            font-family: 'Noto Serif SC', serif;
            float: left;
            font-size: 4.5rem;
            line-height: 0.8;
            margin-right: 1rem;
            margin-top: 0.3rem;
            color: #4f46e5;
        }
        .code-block {
            font-family: 'Courier New', Courier, monospace;
            background-color: #f8fafc;
            border-left: 4px solid #4f46e5;
        }
        .comparison-table {
            border-collapse: separate;
            border-spacing: 0;
        }
        .comparison-table th {
            background-color: #4f46e5;
            color: white;
        }
        .comparison-table tr:nth-child(even) {
            background-color: #f8fafc;
        }
        .comparison-table td, .comparison-table th {
            padding: 1rem;
            border-bottom: 1px solid #e2e8f0;
        }
        .hover-grow {
            transition: transform 0.3s ease;
        }
        .hover-grow:hover {
            transform: translateY(-2px);
        }
        .card-hover {
            transition: box-shadow 0.3s ease;
        }
        .card-hover:hover {
            box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
        }
    </style>
</head>
<body class="bg-gray-50">
    <!-- Hero Section -->
    <div class="relative bg-gradient-to-r from-indigo-600 to-purple-600 py-20 px-4 sm:px-6 lg:px-8">
        <div class="max-w-7xl mx-auto text-center">
            <h1 class="hero-title text-4xl md:text-5xl lg:text-6xl font-bold text-white mb-6">
                JPA查询方式对比：JPQL与原生SQL
            </h1>
            <p class="text-xl text-indigo-100 max-w-3xl mx-auto">
                探索两种查询方式的优缺点，为您的项目选择最佳数据访问策略
            </p>
            <div class="mt-8">
                <span class="inline-flex items-center px-4 py-2 border border-white rounded-full text-sm font-medium text-white bg-opacity-20">
                    <i class="fas fa-database mr-2"></i> Java Persistence API
                </span>
            </div>
        </div>
    </div>

    <!-- Main Content -->
    <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
        <!-- Introduction -->
        <div class="mb-16">
            <p class="drop-cap text-gray-700 text-lg leading-relaxed">
                在使用JPA（Java Persistence API）进行数据库操作时，查询是不可避免的核心操作。JPA提供了两种主要的查询方式：<span class="font-bold text-indigo-600">JPQL（Java Persistence Query Language）</span>和<span class="font-bold text-purple-600">原生SQL（Native Query）</span>。它们各有优缺点，适用于不同的场景。
            </p>
        </div>

        <!-- JPQL Section -->
        <div class="grid md:grid-cols-12 gap-8 mb-16">
            <div class="md:col-span-4">
                <div class="bg-white rounded-xl shadow-md overflow-hidden card-hover sticky top-6">
                    <div class="bg-indigo-600 px-6 py-4">
                        <h2 class="text-2xl font-bold text-white flex items-center">
                            <i class="fas fa-code mr-3"></i> 一、什么是JPQL？
                        </h2>
                    </div>
                    <div class="p-6">
                        <div class="flex items-center mb-4">
                            <div class="w-12 h-12 rounded-full bg-indigo-100 flex items-center justify-center mr-4">
                                <i class="fas fa-question text-indigo-600 text-xl"></i>
                            </div>
                            <h3 class="text-lg font-semibold text-gray-800">1.1 JPQL的定义</h3>
                        </div>
                        <p class="text-gray-700 mb-6">
                            JPQL（Java Persistence Query Language）是JPA提供的一种面向对象的查询语言，它基于SQL语法，但查询的对象是<span class="font-bold text-indigo-600">Java实体（Entity）</span>，而不是数据库表。JPQL能够屏蔽数据库的具体实现，使得代码更具可移植性。
                        </p>
                        
                        <div class="flex items-center mb-4">
                            <div class="w-12 h-12 rounded-full bg-indigo-100 flex items-center justify-center mr-4">
                                <i class="fas fa-star text-indigo-600 text-xl"></i>
                            </div>
                            <h3 class="text-lg font-semibold text-gray-800">1.2 JPQL的特点</h3>
                        </div>
                        <ul class="space-y-2 mb-6">
                            <li class="flex items-start">
                                <i class="fas fa-check-circle text-indigo-500 mt-1 mr-2"></i>
                                <span><strong>面向对象</strong>：查询的是JPA实体，而不是数据库表。</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fas fa-check-circle text-indigo-500 mt-1 mr-2"></i>
                                <span><strong>与数据库无关</strong>：不同数据库供应商的SQL语法可能不同，而JPQL屏蔽了这种差异，能够在多种数据库上运行。</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fas fa-check-circle text-indigo-500 mt-1 mr-2"></i>
                                <span><strong>与Hibernate HQL类似</strong>：语法风格与Hibernate的HQL（Hibernate Query Language）相近。</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fas fa-check-circle text-indigo-500 mt-1 mr-2"></i>
                                <span><strong>支持关联查询</strong>：可以直接使用实体对象的关系映射，而不需要手动编写复杂的JOIN语句。</span>
                            </li>
                        </ul>

                        <div class="flex items-center mb-4">
                            <div class="w-12 h-12 rounded-full bg-indigo-100 flex items-center justify-center mr-4">
                                <i class="fas fa-terminal text-indigo-600 text-xl"></i>
                            </div>
                            <h3 class="text-lg font-semibold text-gray-800">1.3 JPQL的基本语法</h3>
                        </div>
                    </div>
                </div>
            </div>

            <div class="md:col-span-8 space-y-8">
                <div class="bg-white rounded-xl shadow-md overflow-hidden card-hover hover-grow">
                    <div class="px-6 py-4 border-b border-gray-200">
                        <h3 class="text-lg font-semibold text-gray-800 flex items-center">
                            <i class="fas fa-code-branch text-indigo-500 mr-2"></i> 1.3.1 基本查询
                        </h3>
                    </div>
                    <div class="p-6">
                        <pre class="code-block p-4 rounded-lg mb-4">SELECT u FROM User u WHERE u.name = :name</pre>
                        <ul class="text-gray-700 space-y-2">
                            <li><span class="font-semibold">User</span> 是JPA实体，而不是数据库表。</li>
                            <li><span class="font-semibold">u</span> 是User实体的别名。</li>
                            <li><span class="font-semibold">:name</span> 是一个参数，占位符表示查询条件。</li>
                        </ul>
                    </div>
                </div>

                <div class="bg-white rounded-xl shadow-md overflow-hidden card-hover hover-grow">
                    <div class="px-6 py-4 border-b border-gray-200">
                        <h3 class="text-lg font-semibold text-gray-800 flex items-center">
                            <i class="fas fa-project-diagram text-indigo-500 mr-2"></i> 1.3.2 关联查询
                        </h3>
                    </div>
                    <div class="p-6">
                        <pre class="code-block p-4 rounded-lg mb-4">SELECT o FROM Order o JOIN o.customer c WHERE c.name = :customerName</pre>
                        <p class="text-gray-700">
                            这里的<span class="font-semibold">o.customer</span> 是Order实体与Customer实体的关联字段，JPQL可以直接使用实体之间的关系，而不需要写<span class="font-semibold">JOIN</span>操作数据库表。
                        </p>
                    </div>
                </div>

                <div class="bg-white rounded-xl shadow-md overflow-hidden card-hover hover-grow">
                    <div class="px-6 py-4 border-b border-gray-200">
                        <h3 class="text-lg font-semibold text-gray-800 flex items-center">
                            <i class="fas fa-lightbulb text-indigo-500 mr-2"></i> 什么时候使用JPQL？
                        </h3>
                    </div>
                    <div class="p-6">
                        <div class="mb-4">
                            <h4 class="font-semibold text-indigo-600 mb-2">4.1 常规业务查询</h4>
                            <p class="text-gray-700">
                                如果查询的目标是实体对象，并且没有特殊的数据库功能需求，使用JPQL更符合JPA的设计理念。例如：
                            </p>
                            <pre class="code-block p-4 rounded-lg my-2">SELECT p FROM Product p WHERE p.price > :price</pre>
                            <p class="text-gray-700">
                                这类查询适用于一般的CRUD操作，并且JPQL的面向对象特性可以减少开发成本。
                            </p>
                        </div>

                        <div class="mb-4">
                            <h4 class="font-semibold text-indigo-600 mb-2">4.2 关联查询</h4>
                            <p class="text-gray-700">
                                JPQL允许直接在查询中使用实体的关系映射，而不需要手写JOIN，比如：
                            </p>
                            <pre class="code-block p-4 rounded-lg my-2">SELECT o FROM Order o WHERE o.customer.name = :customerName</pre>
                            <p class="text-gray-700">
                                这里<span class="font-semibold">o.customer.name</span> 是面向对象的写法，而原生SQL则需要JOIN操作数据库表。
                            </p>
                        </div>

                        <div>
                            <h4 class="font-semibold text-indigo-600 mb-2">4.3 可移植性要求高的项目</h4>
                            <p class="text-gray-700">
                                如果你的项目需要支持多个数据库，使用JPQL可以减少数据库特定语法的依赖，增强可移植性。
                            </p>
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <!-- Native SQL Section -->
        <div class="grid md:grid-cols-12 gap-8 mb-16">
            <div class="md:col-span-4">
                <div class="bg-white rounded-xl shadow-md overflow-hidden card-hover sticky top-6">
                    <div class="bg-purple-600 px-6 py-4">
                        <h2 class="text-2xl font-bold text-white flex items-center">
                            <i class="fas fa-database mr-3"></i> 二、什么是原生SQL？
                        </h2>
                    </div>
                    <div class="p-6">
                        <div class="flex items-center mb-4">
                            <div class="w-12 h-12 rounded-full bg-purple-100 flex items-center justify-center mr-4">
                                <i class="fas fa-question text-purple-600 text-xl"></i>
                            </div>
                            <h3 class="text-lg font-semibold text-gray-800">2.1 原生SQL的定义</h3>
                        </div>
                        <p class="text-gray-700 mb-6">
                            原生SQL（Native SQL）指的是直接执行数据库SQL语句，而不是使用JPA的JPQL。通过<span class="font-mono">@Query</span>或<span class="font-mono">EntityManager.createNativeQuery()</span>来执行SQL查询。
                        </p>
                        
                        <div class="flex items-center mb-4">
                            <div class="w-12 h-12 rounded-full bg-purple-100 flex items-center justify-center mr-4">
                                <i class="fas fa-star text-purple-600 text-xl"></i>
                            </div>
                            <h3 class="text-lg font-semibold text-gray-800">2.2 原生SQL的特点</h3>
                        </div>
                        <ul class="space-y-2 mb-6">
                            <li class="flex items-start">
                                <i class="fas fa-check-circle text-purple-500 mt-1 mr-2"></i>
                                <span><strong>直接操作数据库表</strong>：使用的是数据库原生的表名和字段名，而不是JPA实体类。</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fas fa-check-circle text-purple-500 mt-1 mr-2"></i>
                                <span><strong>支持数据库特定功能</strong>：可以使用数据库特有的语法、函数（如LIMIT、JSON查询等），提高查询性能。</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fas fa-check-circle text-purple-500 mt-1 mr-2"></i>
                                <span><strong>适用于复杂查询</strong>：对于非常复杂的查询（如存储过程、大量子查询等），原生SQL比JPQL更高效。</span>
                            </li>
                        </ul>

                        <div class="flex items-center mb-4">
                            <div class="w-12 h-12 rounded-full bg-purple-100 flex items-center justify-center mr-4">
                                <i class="fas fa-terminal text-purple-600 text-xl"></i>
                            </div>
                            <h3 class="text-lg font-semibold text-gray-800">2.3 原生SQL的基本使用</h3>
                        </div>
                    </div>
                </div>
            </div>

            <div class="md:col-span-8 space-y-8">
                <div class="bg-white rounded-xl shadow-md overflow-hidden card-hover hover-grow">
                    <div class="px-6 py-4 border-b border-gray-200">
                        <h3 class="text-lg font-semibold text-gray-800 flex items-center">
                            <i class="fas fa-code-branch text-purple-500 mr-2"></i> 2.3.1 基本查询
                        </h3>
                    </div>
                    <div class="p-6">
                        <pre class="code-block p-4 rounded-lg mb-4">@Query(value = "SELECT * FROM users WHERE name = :name", nativeQuery = true)
List<User> findByName(@Param("name") String name);</pre>
                        <ul class="text-gray-700 space-y-2">
                            <li><span class="font-semibold">nativeQuery = true</span> 表示使用原生SQL。</li>
                            <li><span class="font-semibold">users</span> 是数据库表名，而不是JPA实体名。</li>
                            <li>直接使用<span class="font-semibold">*</span>或具体字段名进行查询。</li>
                        </ul>
                    </div>
                </div>

                <div class="bg-white rounded-xl shadow-md overflow-hidden card-hover hover-grow">
                    <div class="px-6 py-4 border-b border-gray-200">
                        <h3 class="text-lg font-semibold text-gray-800 flex items-center">
                            <i class="fas fa-project-diagram text-purple-500 mr-2"></i> 2.3.2 复杂查询
                        </h3>
                    </div>
                    <div class="p-6">
                        <pre class="code-block p-4 rounded-lg mb-4">@Query(value = "SELECT * FROM orders o JOIN customers c ON o.customer_id = c.id WHERE c.name = :customerName", nativeQuery = true)
List<Order> findOrdersByCustomerName(@Param("customerName") String customerName);</pre>
                        <p class="text-gray-700">
                            这里直接使用了数据库表的<span class="font-semibold">JOIN</span>操作，而JPQL的方式是基于对象关联的。
                        </p>
                    </div>
                </div>

                <div class="bg-white rounded-xl shadow-md overflow-hidden card-hover hover-grow">
                    <div class="px-6 py-4 border-b border-gray-200">
                        <h3 class="text-lg font-semibold text-gray-800 flex items-center">
                            <i class="fas fa-lightbulb text-purple-500 mr-2"></i> 什么时候使用原生SQL？
                        </h3>
                    </div>
                    <div class="p-6">
                        <div class="mb-4">
                            <h4 class="font-semibold text-purple-600 mb-2">5.1 需要数据库特有的功能</h4>
                            <p class="text-gray-700">
                                如果项目中需要使用数据库的特定功能（如JSON查询、全文搜索、窗口函数等），JPQL无法满足需求，此时原生SQL更合适。例如：
                            </p>
                            <pre class="code-block p-4 rounded-lg my-2">SELECT id, json_extract(data, '$.name') AS name FROM users</pre>
                            <p class="text-gray-700">
                                JPQL不支持<span class="font-semibold">json_extract()</span>，但原生SQL可以直接使用。
                            </p>
                        </div>

                        <div class="mb-4">
                            <h4 class="font-semibold text-purple-600 mb-2">5.2 执行高性能优化</h4>
                            <p class="text-gray-700">
                                对于大数据量的查询，原生SQL可以结合索引、优化查询计划、使用数据库缓存等方式，提高查询性能。例如：
                            </p>
                            <pre class="code-block p-4 rounded-lg my-2">SELECT /*+ INDEX(users idx_name) */ * FROM users WHERE name = :name</pre>
                            <p class="text-gray-700">
                                这里的<span class="font-semibold">INDEX</span>提示可以帮助数据库优化查询，JPQL无法做到这一点。
                            </p>
                        </div>

                        <div>
                            <h4 class="font-semibold text-purple-600 mb-2">5.3 执行复杂查询</h4>
                            <p class="text-gray-700">
                                如果查询逻辑非常复杂，比如涉及多个表的<span class="font-semibold">UNION</span>查询、大量子查询、存储过程等，原生SQL更具可读性。例如：
                            </p>
                            <pre class="code-block p-4 rounded-lg my-2">SELECT * FROM orders WHERE amount > (SELECT AVG(amount) FROM orders)</pre>
                            <p class="text-gray-700">
                                这类查询在JPQL中难以实现。
                            </p>
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <!-- Comparison Section -->
        <div class="bg-white rounded-xl shadow-md overflow-hidden mb-16 card-hover">
            <div class="px-6 py-4 border-b border-gray-200 bg-gradient-to-r from-indigo-600 to-purple-600">
                <h2 class="text-2xl font-bold text-white flex items-center">
                    <i class="fas fa-balance-scale mr-3"></i> 三、JPQL与原生SQL的区别
                </h2>
            </div>
            <div class="p-6 overflow-x-auto">
                <table class="comparison-table w-full rounded-lg overflow-hidden">
                    <thead>
                        <tr>
                            <th class="text-left">对比项</th>
                            <th class="text-left">JPQL</th>
                            <th class="text-left">原生SQL</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td><strong>查询目标</strong></td>
                            <td>JPA实体对象</td>
                            <td>数据库表</td>
                        </tr>
                        <tr>
                            <td><strong>数据库无关性</strong></td>
                            <td>具备数据库无关性，可移植性更强</td>
                            <td>依赖于数据库特定语法</td>
                        </tr>
                        <tr>
                            <td><strong>查询复杂度</strong></td>
                            <td>适用于大部分常见查询，语法简洁</td>
                            <td>适用于复杂查询，如存储过程、窗口函数等</td>
                        </tr>
                        <tr>
                            <td><strong>性能优化</strong></td>
                            <td>通过Hibernate等ORM框架优化</td>
                            <td>直接执行SQL，优化更自由</td>
                        </tr>
                        <tr>
                            <td><strong>使用难度</strong></td>
                            <td>相对容易，基于面向对象思想</td>
                            <td>需要了解SQL及数据库结构</td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>

        <!-- Visualization -->
        <div class="bg-white rounded-xl shadow-md overflow-hidden mb-16 card-hover">
            <div class="px-6 py-4 border-b border-gray-200 bg-gradient-to-r from-indigo-600 to-purple-600">
                <h2 class="text-2xl font-bold text-white flex items-center">
                    <i class="fas fa-project-diagram mr-3"></i> 查询方式选择流程图
                </h2>
            </div>
            <div class="p-6">
                <div class="mermaid">
                    graph TD
                        A[开始选择查询方式] --> B{是否需要数据库特定功能?}
                        B -->|是| C[使用原生SQL]
                        B -->|否| D{查询是否非常复杂?}
                        D -->|是| C
                        D -->|否| E{是否需要高性能优化?}
                        E -->|是| C
                        E -->|否| F[使用JPQL]
                </div>
            </div>
        </div>
    </div>

    <!-- Footer -->
    <footer class="bg-gray-900 text-gray-200 py-8">
        <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
            <div class="flex flex-col md:flex-row justify-between items-center">
                <div class="mb-4 md:mb-0">
                    <h3 class="text-xl font-bold">技术小馆</h3>
                    <p class="text-gray-400">专业的技术知识分享平台</p>
                </div>
                <div>
                    <a href="http://www.yuque.com/jtostring" class="text-indigo-300 hover:text-white transition-colors duration-200 flex items-center">
                        <i class="fas fa-external-link-alt mr-2"></i> http://www.yuque.com/jtostring
                    </a>
                </div>
            </div>
        </div>
    </footer>

    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <script>
        mermaid.initialize({
            startOnLoad: true,
            theme: 'default',
            flowchart: {
                useMaxWidth: true,
                htmlLabels: true,
                curve: 'basis'
            }
        });
    </script>
</body>
</html>
```